<!-- -->
<template>
  <div class="public">
    <Header>选择城市</Header>
    <div class="con">
      <div class="now-city">当前城市</div>
      <div class="city">
        <baidu-map @ready="handler" style="display:none"></baidu-map>
        {{ address }}
      </div>
      <van-index-bar :indexList="cityList">
        <div v-for="(item, index) in renderCityList" :key="index">
          <van-index-anchor :index="item.key" />
          <van-cell v-for="(val, i) in item.citys" :key="i" :title="val.name" />
        </div>
      </van-index-bar>
    </div>
  </div>
</template>

<script>
import { mapState, mapMutations } from "vuex";
import Header from "@/components/Header.vue";
import { getCityData } from "../../api";
import { cPinyin } from "@/utils";
export default {
  name: "city",
  // import引入到组件需要注入到对象中才能使用
  components: { Header },
  data() {
    // 这里存放数据
    return {
      indexList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
      cityList: [], //存放城市的数组
      renderCityList: [] // 存放 根据首字母划分的数组
    };
  },
  // 监听属性 类似于data概念
  computed: {
    ...mapState(["address"])
  },
  // 监听data中的数据变化
  watch: {},
  // 方法集合
  methods: {
    ...mapMutations(["changeAddress"]),
    // 获取城市
    /*
      1.首先要给所有数据添加一个字段 首字母拼音的字段
      2.去重
      3.实现字母排序
    */
    getCity() {
      getCityData().then(res => {
        // 1.首先要给所有数据添加一个字段 首字母拼音的字段
        let cityList = res.data.map(item => {
          return {
            ...item,
            py: cPinyin(item.name.slice(0, 1))
          };
        });

        // 2.去重
        let newArr = Array.from(new Set(cityList.map(item => item.py)));

        // 3.实现字母排序
        this.cityList = newArr.sort((a, b) => {
          return a.charCodeAt(0) - b.charCodeAt(0);
        });
        // 生成需要遍历渲染的数组
        this.renderCityList = this.cityList.map(item => {
          return {
            key: item,
            citys: cityList.filter(val => val.py === item)
          };
        });

        console.log(this.cityList);
      });
    },
    // 定位
    handler(map) {
      const location = new map.BMap.Geolocation();
      // geolocation： 定位
      // getCurrentPosition 获取当前位置信息
      // r当前位置信息
      location.getCurrentPosition(r => {
        this.changeAddress(r.address.city);
      });
    }
  },
  //生命周期 - 创建完成 (可以访问当前this实例)
  created() {
    // 调用获取城市数据接口
    this.getCity();
  },
  //生命周期 - 挂载完成 (可以访问DOM元素)
  mounted() {}
};
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<!--使用了scoped属性之后，父组件的style样式将不会渗透到子组件中，-->
<!--然而子组件的根节点元素会同时被设置了scoped的父css样式和设置了scoped的子css样式影响，-->
<!--这么设计的目的是父组件可以对子组件根元素进行布局。-->
<style lang="scss" scoped>
.con {
  flex: 1;
  overflow-y: auto;
}
.now-city {
  width: 100%;
  height: 30px;
  background-color: rgba(242, 242, 242, 1);
  border: 1px solid #ccc;
  font-size: 14px;
  display: flex;
  align-items: center;
  padding-left: 10px;
}

.city {
  width: 100%;
  height: 45px;
  font-size: 14px;
  border-bottom: 1px solid #ccc;
  display: flex;
  align-items: center;
  padding: 10px;
}
</style>
